//////////////////////////////////////////////////////////////////////////////////
// information ///////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
/*
	
*/
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
// ANIMATION STRUCTURE ///////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#ifndef _SANIMATION_H_
#define _SANIMATION_H_

//////////////////////////////////////////////////////////////////////////////////
// INCLUDES / LIBS ///////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#pragma comment ( lib, "d3dx8.lib"  )
#pragma comment ( lib, "d3dxof.lib" )
#pragma comment ( lib, "winmm.lib"  )

#pragma comment ( lib, "dxguid.lib" )
#pragma comment ( lib, "d3d8.lib"   )
#pragma comment ( lib, "dxerr8.lib" )

#include <d3d8.h>
#include <math.h>
#include <D3DX8.h>

#define WIN32_LEAN_AND_MEAN
#include < windows.h >

#include "sFrame.h"
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
// DEFINES ///////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#define DARKSDK __declspec ( dllexport )
#define SAFE_DELETE( p )       { if ( p ) { delete ( p );       ( p ) = NULL; } }
#define SAFE_RELEASE( p )      { if ( p ) { ( p )->Release ( ); ( p ) = NULL; } }
#define SAFE_DELETE_ARRAY( p ) { if ( p ) { delete [ ] ( p );   ( p ) = NULL; } }
#define GXRELEASE(_p) do       { if ((_p) != NULL) {(_p)->Release(); (_p) = NULL;} } while (0)
//////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////
// STRUCTURES ////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
struct sXFileRotateKey
{
	DWORD Time;
	DWORD Floats;
	float w;
	float x;
	float y;
	float z;
};

struct sXFileScaleKey
{
	DWORD	    Time;
	DWORD       Floats;
	D3DXVECTOR3	Scale;
};

struct sXFilePositionKey
{
	DWORD       Time;
	DWORD       Floats;
	D3DXVECTOR3	Pos;
};

struct sXFileMatrixKey
{
	DWORD	    Time;
	DWORD       Floats;	
	D3DXMATRIX	Matrix;
};

struct sRotateKey
{
	DWORD          Time;
	D3DXQUATERNION Quaternion;
};

struct sPositionKey
{
	DWORD     	Time;
	D3DXVECTOR3	Pos;
	D3DXVECTOR3	PosInterpolation;
};

struct sScaleKey
{
	DWORD	    Time;
	D3DXVECTOR3	Scale;
	D3DXVECTOR3	ScaleInterpolation;
};

struct sMatrixKey
{
	DWORD	   Time;
	D3DXMATRIX Matrix;
	D3DXMATRIX MatInterpolation;
};

struct sAnimation
{
	char*			m_Name;
	char*			m_FrameName;
	sFrame*			m_Frame;

	BOOL			m_Loop;
	BOOL			m_Linear;

	DWORD           m_NumPositionKeys;
	sPositionKey*	m_PositionKeys;

	DWORD           m_NumRotateKeys;
	sRotateKey*		m_RotateKeys;

	DWORD           m_NumScaleKeys;
	sScaleKey*		m_ScaleKeys;

	DWORD           m_NumMatrixKeys;
	sMatrixKey*		m_MatrixKeys;

	sAnimation*		m_Next;

	sAnimation  ( );
	~sAnimation ( );

	void Update ( float Time, BOOL Smooth );
};
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////

#endif _SANIMATION_H_